// http缓存分为2种 强制缓存（首页没法强制缓存）
// 对比缓存


let http = require('http')
let mime = require('mime')
let url = require('url')
let fs = require('fs')
let path = require('path')
let crypto = require('crypto')

http.createServer(function (req, res) {
  let {pathname}=url.parse(req.url,true)
  console.log(pathname);


  // res.setHeader('Cache-Control','max-age=10000');//老版浏览器不支持 cache control
  // res.setHeader('Expires',(new Date(Date.now()+10000).toGMTString()));//老版浏览器不支持 cache control



  let abs = path.join(__dirname,pathname);

  fs.stat(path.join(__dirname,pathname),(err,stat)=>{
    if (err){
      res.statusCode = 404;
      res.end('Not Found.')
      return;
    }
    if (stat.isFile()){

      // 缺陷：如果文件没改，时间变了  时间精确到秒 可能会有问题。CDN 不同地域时间可能不同。


      // if (req.headers['if-modified-since']===stat.ctime.toUTCString()){
      //   res.statusCode=304; //
      //   res.end();
      //   return;
      // }
      // res.setHeader('Last-Modified',stat.ctime.toUTCString());


      // Etag 实体内容 他是根据文件内容算出唯一的值 md5
      let md5 = crypto.createHash('md5');
      let rs= fs.createReadStream(abs);
      let arr = [];
      rs.on('data',function (data) {
        // res.write(data);
        md5.update(data);
        arr.push(data);
      });
      rs.on('end',function () {

        let etag = md5.digest('base64');
        if (req.headers['if-none-match']===etag){
          res.statusCode=304;
          res.end();
          return;
        }
        res.setHeader('Etag',etag);
        //If-None-Match 浏览器  Etag 服务器
        res.end(Buffer.concat(arr))
      })
    } else {
      res.end('Not Found');

    }

  })
}).listen(3000)

// 一开始全部使用浏览器访问服务器端 先加一个强制缓存，缓存5s。
// 过了5s后，再发送请求 对比缓存 先判断 last-modified 再判断 etag.
// 如果都成立返回304
